package com.zjl.学习.第02章_作业对象Job;

import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.JobParametersIncrementer;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.job.flow.JobExecutionDecider;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * public interface JobParametersIncrementer {
 * 	    JobParameters getNext(@Nullable JobParameters parameters);
 * }
 * 详解接口
 * @see org.springframework.batch.core.JobParametersIncrementer
 *
 * JobParametersIncrementer 增量器是一个接口，里面只有getNext方法，参数是JobParameters 返回值也是JobParameters。
 * 通过这个getNext方法，在作业启动时我们可以给JobParameters 添加或者修改参数。
 * 简单理解就是让标识参数每次都变动
 *
 * 作业递增run.id参数
 * Spring Batch 提供一个run.id自增参数增量器：RunIdIncrementer，每次启动时，里面维护名为run.id 标识参数，每次启动让其自增 1。
 * @see org.springframework.batch.core.launch.support.RunIdIncrementer
 *
 *
 *
 *
 *
 *
 */
public class D_作业增量参数JobParametersIncrementer {
    /**
     * 这种 Job 相同名字的情况下，即 .get("job002") 的名字相同。
     * 且这是个自启动项目，即配置文件没有设置
     * ------------------------------------
     *  spring:
     *    batch:
     *      job:
     *        enabled: true  #true这里是设置会自动先执行一次定义的job
     *  --------------------------------------------
     *  且 设置了 .incrementer(new RunIdIncrementer())
     *  //放入 作业递增 run.id 参数 或其他 继承了 JobParametersIncrementer 的 作业参数增量表
     *  都会 自己从数据库中找 识别参数 会将最近的 job 相同名字的所有参数读取出来 进行参数替换
     *  识别参数 (Job Instance = Job名称 + 识别参数)
     *  如 new RunIdIncrementer()
     *  会将最近的 job 相同名字的所有参数读取出来， run.id + 1
     *  自定义 切继承了 JobParametersIncrementer接口的也是
     *  会将最近的 job 相同名字的所有参数读取出来
     *  并放入 JobParameters 参数中，再用 新的覆盖，
     *
     * @param args
     */
    public static void main(String[] args) {
        //用法
        JobBuilderFactory jobBuilderFactory = new JobBuilderFactory(null);
        jobBuilderFactory.get("作业增量参数")
                .start((Step) null)
                .next((Step) null)
                .incrementer(new RunIdIncrementer())//放入 batch 自带的  参数方法 作业递增 run.id 参数
                .incrementer(new MyParamIncrementer())//放入自定义的 参数方法
                .build();
    }
}
@Component//方锐 bean
class MyParamIncrementer implements JobParametersIncrementer {
    @Override
    public JobParameters getNext(JobParameters parameters) {
        return new JobParametersBuilder(parameters)
                .addLong("daily", new Date().getTime())  //添加时间戳
                .toJobParameters();
    }
}